package com.dkd.common.core.domain;

import java.io.Serializable;
import java.util.List;

import com.dkd.common.constant.HttpStatus;
import lombok.Data;

/**
 * 响应信息主体
 *
 * @author ruoyi
 */

@Data
public class R2<T>  implements Serializable
{
    private static final long serialVersionUID = 1L;

    /** 成功 */
    public static final int SUCCESS = HttpStatus.SUCCESS;

    /** 失败 */
    public static final int FAIL = HttpStatus.ERROR;

    private int code;

    private String msg;

    private T data;

//    private T rows;


    /**
     * 返回成功的数据、状态码和信息（列表查询）
     */
    public static <T> R2<T> oks(T rows)
    {
        return restResult(rows, SUCCESS, "操作成功");
    }

    /**
     * 返回的数据、状态码和信息（id查询）
     */
    public static <T> R2<T> ok(T data)
    {
        return restResult(data, SUCCESS, "操作成功");
    }


    /**
     * 返回成功的信息和状态码（增，改，删）
     */
    public static <T> R2<T> ok()
    {
        return restResult(null, SUCCESS, "操作成功");
    }


    /**
     * 返回失败的操作码和信息（增，改，删）
     */
    public static <T> R2<T> fail()
    {
        return restResult(null, FAIL, "操作失败");
    }


    /**
     * 返回成功的状态码和自定义数据和信息
     */
    public static <T> R2<T> ok(T data, String msg)
    {
        return restResult(data, SUCCESS, msg);
    }




    /**
     * 返回失败的操作码和自定义信息
     */
    public static <T> R2<T> fail(String msg)
    {
        return restResult(null, FAIL, msg);
    }


    /**
     * 返回失败的状态码和信息，自定义返回数据
     */
    public static <T> R2<T> fail(T data)
    {
        return restResult(data, FAIL, "操作失败");
    }


    /**
     * 返回失败的状态码，自定义返回数据和信息
     */
    public static <T> R2<T> fail(T data, String msg)
    {
        return restResult(data, FAIL, msg);
    }


    /**
     * 返回自定义状态码和信息
     */
    public static <T> R2<T> fail(int code, String msg)
    {
        return restResult(null, code, msg);
    }



    /**
     * 通用返回结果
     */
    private static <T> R2<T> restResult(T data, int code, String msg)
    {
        R2<T> apiResult = new R2<>();
        apiResult.setCode(code);
//        //判断传进来的data是否是集合还是对象，对象就set进data，集合就set进rows
//        if(data instanceof java.util.Collection){
//            apiResult.setRows(data);
//        }else{
//            apiResult.setData(data);
//        }
        apiResult.setData(data);
        apiResult.setMsg(msg);
        return apiResult;
    }

    //通过返回行数判断增加、修改或者删除操作的成功或者失败
    public static R2 restResult(int rows)
    {
        return rows > 0? R2.ok() : R2.fail();
    }

    public static <T> Boolean isError(R<T> ret)
    {
        return !isSuccess(ret);
    }

    public static <T> Boolean isSuccess(R<T> ret)
    {
        return R.SUCCESS == ret.getCode();
    }
}
